<?php

/**
 * 应用配置辅助函数
 * 提供便捷的方式来获取各应用的配置
 */

use support\Log;
if (!function_exists('getConfig')) {
    /**
     * 获取应用配置
     * 
     * @param string $key 配置键名，支持点分割方式如api.jwt.ttl
     * @param mixed $default 默认值
     * @return mixed
     * 
     * @example
     * getConfig('api.jwt.secret') // 获取API应用的JWT密钥
     * getConfig('admin.route') // 获取Admin应用的路由配置
     * getConfig('api.jwt.ttl', 3600) // 获取JWT有效期，不存在时使用默认值3600
     * getConfig('global.system.name') // 获取系统名称
     */
    function getConfig(string $key, $default = null)
    {
        static $cache = [];
        
        // 检查缓存
        if (isset($cache[$key])) {
            return $cache[$key];
        }
        
        // 分割键名
        $parts = explode('.', $key);
        if (empty($parts)) {
            return $default;
        }
        
        // 获取主配置
        $mainConfig = config('config');
        if (empty($mainConfig)) {
            return $default;
        }
        
        $result = $mainConfig;
        
        // 逐级访问配置
        foreach ($parts as $part) {
            if (!is_array($result) || !isset($result[$part])) {
                $cache[$key] = $default;
                return $default;
            }
            $result = $result[$part];
        }
        
        // 缓存结果
        $cache[$key] = $result;
        return $result;
    }
}

if (!function_exists('app_config')) {
    /**
     * 获取应用配置
     * 
     * @param string $app 应用名称 (admin, api, common)
     * @param string $config 配置名称 (route, jwt, etc.)
     * @param string|null $key 配置键名，null返回整个配置数组
     * @param mixed $default 默认值
     * @return mixed
     * 
     * @example
     * app_config('api', 'jwt', 'secret') // 获取API应用的JWT密钥
     * app_config('admin', 'route') // 获取Admin应用的全部路由配置
     */
    function app_config(string $app, string $config, ?string $key = null, $default = null)
    {
        static $cache = [];
        
        // 构建缓存键
        $cacheKey = $app . '_' . $config;
        
        // 如果缓存中没有，从主配置中加载
        if (!isset($cache[$cacheKey])) {
            $mainConfig = config('config');
            $cache[$cacheKey] = $mainConfig[$app][$config] ?? [];
        }
        
        $configData = $cache[$cacheKey];
        
        if ($key === null) {
            return $configData ?: $default;
        }
        
        return $configData[$key] ?? $default;
    }
}

if (!function_exists('get_applications')) {
    /**
     * 获取所有可用的应用列表
     * 
     * @return array
     */
    function get_applications(): array
    {
        $mainConfig = config('config');
        return $mainConfig['global']['applications'] ?? [];
    }
}

if (!function_exists('get_app_configs')) {
    /**
     * 获取指定应用的所有配置
     * 
     * @param string $app 应用名称
     * @return array
     */
    function get_app_configs(string $app): array
    {
        $mainConfig = config('config');
        return $mainConfig[$app] ?? [];
    }
}

if (!function_exists('list_app_configs')) {
    /**
     * 列出指定应用的所有配置文件
     * 
     * @param string $app 应用名称
     * @return array
     */
    function list_app_configs(string $app): array
    {
        $mainConfig = config('config');
        return array_keys($mainConfig[$app] ?? []);
    }
}

if (!function_exists('search_config')) {
    /**
     * 在所有应用中搜索配置
     * 
     * @param string $configName 配置名称
     * @param string|null $key 配置键名
     * @return array
     */
    function search_config(string $configName, ?string $key = null): array
    {
        $mainConfig = config('config');
        $results = [];
        
        foreach ($mainConfig as $app => $configs) {
            if ($app === 'global') continue; // 跳过全局配置
            
            if (isset($configs[$configName])) {
                if ($key === null) {
                    $results[$app] = $configs[$configName];
                } elseif (isset($configs[$configName][$key])) {
                    $results[$app] = $configs[$configName][$key];
                }
            }
        }
        
        return $results;
    }
}

if (!function_exists('hasConfig')) {
    /**
     * 检查配置是否存在
     * 
     * @param string $key 配置键名，支持点分割方式
     * @return bool
     */
    function hasConfig(string $key): bool
    {
        return getConfig($key) !== null;
    }
}

if (!function_exists('getConfigArray')) {
    /**
     * 获取配置数组，支持通配符模式
     * 
     * @param string $pattern 配置模式，支持通配符如api.*.secret
     * @return array
     */
    function getConfigArray(string $pattern): array
    {
        $mainConfig = config('config');
        $results = [];
        
        // 分割模式
        $parts = explode('.', $pattern);
        
        if (count($parts) === 1) {
            // 获取整个应用的配置
            return $mainConfig[$parts[0]] ?? [];
        }
        
        $app = $parts[0];
        $configName = $parts[1];
        
        if (!isset($mainConfig[$app][$configName])) {
            return [];
        }
        
        $config = $mainConfig[$app][$configName];
        
        // 处理通配符
        if (count($parts) === 2) {
            return $config;
        }
        
        // 处理更深层的配置
        $key = implode('.', array_slice($parts, 2));
        return getConfig($app . '.' . $configName . '.' . $key, []);
    }
}

if (!function_exists('clearConfigCache')) {
    /**
     * 清除配置缓存
     */
    function clearConfigCache(): void
    {
        // 由于getConfig使用静态缓存，无法直接清除
        // 这里提供一个占位函数，实际应用中可能需要更复杂的缓存机制
    }
}

if (!function_exists('dumpConfig')) {
    /**
     * 调试输出配置信息
     * 
     * @param string|null $key 配置键名，null输出所有配置
     */
    function dumpConfig(?string $key = null): void
    {
        if ($key === null) {
            $config = config('config');
        } else {
            $config = getConfig($key);
        }
        
        if (PHP_SAPI === 'cli') {
            echo json_encode($config, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n";
        } else {
            Log::info('配置信息: ' . json_encode($config, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
        }
    }
}